home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / delphi.swg / 0042_Customizing the Slidebars.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-11-22  |  22.1 KB  |  622 lines

  1. unit SlideBar;
  2.  
  3. interface
  4.  
  5. {$R SLIDEBAR.RES} { see below for XX3401 code for resource file }
  6.  
  7. uses
  8.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  9.   Forms, Dialogs, Menus;
  10.  
  11. type
  12.   TBarStyle    = (bsLowered,bsRaised);
  13.   TOrientation = (orVertical,orHorizontal);
  14.   TThumbStyle  = (tsBar1,tsBar2,tsBar3,tsBar4,tsCircle1,tsSquare1,
  15.                   tsDiamond1,tsDiamond2,tsDiamond3,tsDiamond4);
  16.   TSlideBar = class(TCustomControl)
  17.   private
  18.     FFocusColor              : TColor;
  19.     FHandCursor              : Boolean;
  20.     FLabels                  : TStringList;
  21.     FMax,FMin,FPosition      : Integer;
  22.     FOrientation             : TOrientation;
  23.     FStyle                   : TBarStyle;
  24.     FThickness               : Byte;
  25.     FThumbStyle              : TThumbStyle;
  26.     FTicks                   : Boolean;
  27.     FOnChange                : TNotifyEvent;
  28.     ThumbBmp,MaskBmp,BkgdBmp : TBitmap;
  29.     DragVal,HalfTW,HalfTH    : Integer;
  30.     ThumbRect                : TRect;
  31.     TempDC                   : HDC;
  32.     HandPointer              : HCursor;
  33.     OriginalCursor           : HCursor;
  34.     procedure SetLabels(A: TStringList);
  35.     procedure SetMax(A: Integer);
  36.     procedure SetMin(A: Integer);
  37.     procedure SetOrientation(A: TOrientation);
  38.     procedure SetPosition(A: Integer);
  39.     procedure SetStyle(A: TBarStyle);
  40.     procedure SetThickness(A: Byte);
  41.     procedure SetThumbStyle(A: TThumbStyle);
  42.     procedure SetTicks(A: Boolean);
  43.     procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
  44.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  45.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  46.     procedure WMSize(var Message: TWMSize);             message WM_SIZE;
  47.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  48.   protected
  49.     Dragging                 : Boolean;
  50.     procedure Paint; override;
  51.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  52.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  53.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  54.     function  NewPosition(WhereX,WhereY: Integer): Integer;
  55.     function  IsVert: Boolean;
  56.     procedure RemoveThumbBar;
  57.     procedure DrawThumbBar;
  58.     procedure DrawTrench;
  59.     procedure SaveBackground;
  60.     procedure WhereIsBar;
  61.     procedure SetTLColor;
  62.     procedure SetBRColor;
  63.   public
  64.     constructor Create(AOwner: TComponent); override;
  65.     destructor Destroy; override;
  66.     function CurrentLabel: String;
  67.   published
  68.     property Enabled;
  69.     property FocusColor: TColor read FFocusColor
  70.                          write FFocusColor default clBlack;
  71.     property HandCursor: Boolean read FHandCursor
  72.                          write FHandCursor default True;
  73.     property Labels: TStringList read FLabels write SetLabels;
  74.     property Max: Integer read FMax write SetMax default 10;
  75.     property Min: Integer read FMin write SetMin default 1;
  76.     property Orientation: TOrientation read FOrientation
  77.                           write SetOrientation default orHorizontal;
  78.     property ParentShowHint;
  79.     property Position: Integer read FPosition write SetPosition default 1;
  80.     property PopupMenu;
  81.     property ShowHint;
  82.     property Style: TBarStyle read FStyle write SetStyle default bsLowered;
  83.     property TabStop default True;
  84.     property TabOrder;
  85.     property Thickness: Byte read FThickness write SetThickness default 1;
  86.     property ThumbStyle: TThumbStyle read FThumbStyle
  87.                          write SetThumbStyle default tsCircle1;
  88.     property Ticks: Boolean read FTicks write SetTicks default True;
  89.     property Visible;
  90.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  91.     property OnEnter;
  92.     property OnExit;
  93.     property OnKeyDown;
  94.     property OnKeyPress;
  95.     property OnKeyUp;
  96.   end;
  97.  
  98. procedure Register;
  99.  
  100. implementation
  101.  
  102. function MinInt(A,B: Integer): Integer;
  103. begin
  104.   If A > B Then MinInt := B Else MinInt := A;
  105. end;
  106.  
  107. function MaxInt(A,B: Integer): Integer;
  108. begin
  109.   If A > B Then MaxInt := A Else MaxInt := B;
  110. end;
  111.  
  112. procedure Register;
  113. begin
  114.   RegisterComponents('Standard', [TSlideBar]);
  115. end;
  116.  
  117. (******************
  118.  TSlideBar Methods
  119. ******************)
  120.  
  121. constructor TSlideBar.Create(AOwner: TComponent);
  122. begin
  123.   inherited Create(AOwner);
  124.   Height := 15;
  125.   Width := 100;
  126.   ThumbBmp := TBitmap.Create;
  127.   MaskBmp := TBitmap.Create;
  128.   BkgdBmp := TBitmap.Create;
  129.   HandPointer := LoadCursor(HInstance, 'HandPointer');
  130.   FFocusColor := clBlack;
  131.   FHandCursor := True;
  132.   FLabels := TStringList.Create;
  133.   FMin := 1;
  134.   FMax := 10;
  135.   FOrientation := orHorizontal;
  136.   FPosition := 1;
  137.   FStyle := bsLowered;
  138.   FThickness := 1;
  139.   FTicks := True;
  140.   Dragging := False;
  141.   DragVal := 0;
  142.   ThumbStyle := tsCircle1;
  143.   TabStop := True;
  144. end;
  145.  
  146. destructor TSlideBar.Destroy;
  147. begin
  148.   FLabels.Free;
  149.   ThumbBmp.Free;
  150.   MaskBmp.Free;
  151.   BkgdBmp.Free;
  152.   inherited Destroy;
  153. end;
  154.  
  155. procedure TSlideBar.CMEnter(var Message: TCMGotFocus);
  156. begin
  157.   inherited;
  158.   Refresh;
  159. end;
  160.  
  161. procedure TSlideBar.CMExit(var Message: TCMExit);
  162. begin
  163.   inherited;
  164.   Refresh;
  165. end;
  166.  
  167. function TSlideBar.IsVert: Boolean;
  168. begin
  169.   IsVert := (Orientation = orVertical);
  170. end;
  171.  
  172. procedure TSlideBar.KeyDown(var Key: Word; Shift: TShiftState);
  173. var
  174.   b : Integer;
  175. begin
  176.   b := MaxInt(1,(Max-Min) div 10);
  177.   case Key of
  178.     VK_PRIOR : if (Position-b) > Min then
  179.                  Position := Position - b else Position := Min;
  180.     VK_NEXT  : if (Position+b) < Max then
  181.                  Position := Position + b else Position := Max;
  182.     VK_END   : if IsVert then Position := Min else Position := Max;
  183.     VK_HOME  : if IsVert then Position := Max else Position := Min;
  184.     VK_LEFT  : if Position > Min then Position := Position - 1;
  185.     VK_UP    : if Position < Max then Position := Position + 1;
  186.     VK_RIGHT : if Position < Max then Position := Position + 1;
  187.     VK_DOWN  : if Position > Min then Position := Position - 1;
  188.   end;
  189. end;
  190.  
  191. procedure TSlideBar.WMGetDlgCode(var Message: TWMGetDlgCode);
  192. begin
  193.   Message.Result := DLGC_WANTARROWS;
  194.   OriginalCursor := GetClassWord(Handle, GCW_HCURSOR);
  195. end;
  196.  
  197. procedure TSlideBar.WMSize(var Message: TWMSize);
  198. begin
  199.   if Height > Width then
  200.     Orientation := orVertical else Orientation := orHorizontal;
  201. end;
  202.  
  203. procedure TSlideBar.SetLabels(A: TStringList);
  204. begin
  205.   FLabels.Assign(A);
  206. end;
  207.  
  208. procedure TSlideBar.SetMin(A: Integer);
  209. begin
  210.   FMin := A;
  211.   Refresh;
  212. end;
  213.  
  214. procedure TSlideBar.SetMax(A: Integer);
  215. begin
  216.   FMax := A;
  217.   Refresh;
  218. end;
  219.  
  220. procedure TSlideBar.SetOrientation(A: TOrientation);
  221. begin
  222.   FOrientation := A;
  223.   Refresh;
  224. end;
  225.  
  226. procedure TSlideBar.SetPosition(A: Integer);
  227. begin
  228.   if csDesigning in ComponentState then
  229.     begin
  230.       if (A >= Min) and (A <= Max) Then FPosition := A;
  231.       Refresh;
  232.     end
  233.   else
  234.     begin
  235.       RemoveThumbBar;
  236.       if (A >= Min) and (A <= Max) Then FPosition := A;
  237.       WhereIsBar;
  238.       SaveBackground;
  239.       DrawThumbBar;
  240.       if Assigned(FOnChange) then FOnChange(Self);
  241.     end;
  242. end;
  243.  
  244. procedure TSlideBar.SetStyle(A: TBarStyle);
  245. begin
  246.   FStyle := A;
  247.   Refresh;
  248. end;
  249.  
  250. procedure TSlideBar.SetThickness(A: Byte);
  251. begin
  252.   If (A > 0) and (A < 6) then
  253.     begin FThickness := A; Refresh; end;
  254. end;
  255.  
  256. procedure TSlideBar.SetThumbStyle(A: TThumbStyle);
  257. begin
  258.   If ThumbStyle <> A then
  259.     begin
  260.       FThumbStyle := A;
  261.       case ThumbStyle of
  262.         tsBar1     :   ThumbBmp.Handle := LoadBitmap(HInstance,'Bar1');
  263.         tsBar2     :   ThumbBmp.Handle := LoadBitmap(HInstance,'Bar2');
  264.         tsBar3     :   ThumbBmp.Handle := LoadBitmap(HInstance,'Bar3');
  265.         tsBar4     :   ThumbBmp.Handle := LoadBitmap(HInstance,'Bar4');
  266.         tsCircle1  :   ThumbBmp.Handle := LoadBitmap(HInstance,'Circle1');
  267.         tsSquare1  :   ThumbBmp.Handle := LoadBitmap(HInstance,'Square1');
  268.         tsDiamond1 :   ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond1');
  269.         tsDiamond2 :   ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond2');
  270.         tsDiamond3 :   ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond3');
  271.         tsDiamond4 :   ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond4');
  272.       end;
  273.       case ThumbStyle of
  274.         tsBar1     :   MaskBmp.Handle := LoadBitmap(HInstance,'Bar1Mask');
  275.         tsBar2     :   MaskBmp.Handle := LoadBitmap(HInstance,'Bar2Mask');
  276.         tsBar3     :   MaskBmp.Handle := LoadBitmap(HInstance,'Bar3Mask');
  277.         tsBar4     :   MaskBmp.Handle := LoadBitmap(HInstance,'Bar4Mask');
  278.         tsCircle1  :   MaskBmp.Handle := LoadBitmap(HInstance,'Circle1Mask');
  279.         tsSquare1  :   MaskBmp.Handle := LoadBitmap(HInstance,'Square1Mask');
  280.         tsDiamond1 :   MaskBmp.Handle := LoadBitmap(HInstance,'Diamond1Mask');
  281.         tsDiamond2 :   MaskBmp.Handle := LoadBitmap(HInstance,'Diamond2Mask');
  282.         tsDiamond3 :   MaskBmp.Handle := LoadBitmap(HInstance,'Diamond3Mask');
  283.         tsDiamond4 :   MaskBmp.Handle := LoadBitmap(HInstance,'Diamond4Mask');
  284.       end;
  285.       HalfTH := ThumbBmp.Height div 2;
  286.       HalfTW := ThumbBmp.Width div 2;
  287.       Refresh;
  288.     end;
  289. end;
  290.  
  291. procedure TSlideBar.SetTicks(A: Boolean);
  292. begin
  293.   FTicks := A;
  294.   Refresh;
  295. end;
  296.  
  297. function TSlideBar.CurrentLabel: String;
  298. begin
  299.   if ((Position-Min+1) <= Labels.Count) and (Position >= Min) then
  300.     CurrentLabel := Labels[Position-Min]
  301.   else
  302.     CurrentLabel := '<Un-Defined>';
  303. end;
  304.  
  305. function TSlideBar.NewPosition(WhereX,WhereY: Integer): Integer;
  306. var
  307.   H1,W1 : Integer;
  308. begin
  309.   {Calculate the nearest position to where the mouse is located}
  310.   H1 := Height-HalfTH;
  311.   W1 := Width-HalfTW;
  312.   if IsVert then
  313.     Result := Round(((H1-WhereY)/H1)*(Max-Min)+Min)
  314.   else
  315.     Result := Round((WhereX/W1)*(Max-Min)+Min);
  316.   Result := MinInt(MaxInt(Result,Min),Max);
  317. end;
  318.  
  319. procedure TSlideBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  320. var
  321.   A,B,C,D,E : Integer;
  322. begin
  323.   if Button <> mbLeft then exit;
  324.   C := Position-1;
  325.   D := Position;
  326.   E := Position+1;
  327.   {B is the center of the ThumbBar}
  328.   if IsVert then B := ThumbRect.Top+HalfTH else B := ThumbRect.Left+HalfTW;
  329.   if Dragging then
  330.     A := NewPosition(X,Y)
  331.   else
  332.     if IsVert then
  333.       if Y < B then A := E else if Y > B then A := C else A := D
  334.     else
  335.       if X < B then A := C else if X > B then A := E else A := D;
  336.   A := MinInt(MaxInt(A,Min),Max);
  337.   Dragging := False;
  338.   Position := A;
  339. end;
  340.  
  341. procedure TSlideBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  342. begin
  343.   SetFocus;
  344.   Dragging := PtInRect(ThumbRect,Point(X,Y));
  345.   If IsVert then DragVal := Y else DragVal := X;
  346. end;
  347.  
  348. procedure TSlideBar.MouseMove(Shift: TShiftState; X, Y: Integer);
  349. Var
  350.   LastDragVal : Integer;
  351. begin
  352.   if HandCursor then
  353.     SetClassWord(Handle, GCW_HCURSOR, HandPointer)
  354.   else
  355.     SetClassWord(Handle, GCW_HCURSOR, OriginalCursor);
  356.   {Is the left mouse button down and dragging the thumb bar?}
  357.   if (ssLeft in Shift) and Dragging then
  358.     begin
  359.       LastDragVal := DragVal;
  360.       if IsVert then DragVal := Y else DragVal := X;
  361.       {This test eliminates unneccesary repaints}
  362.       if DragVal <> LastDragVal then Position := NewPosition(X,Y);
  363.     end;
  364. end;
  365.  
  366. procedure TSlideBar.RemoveThumbBar;
  367. begin
  368.   {Place the background bitmap where it was last}
  369.   Canvas.Draw(ThumbRect.Left,ThumbRect.Top,BkgdBmp);
  370. end;
  371.  
  372. procedure TSlideBar.DrawThumbBar;
  373. var
  374.   TmpBmp  : TBitMap;
  375.   Rect1   : TRect;
  376. begin
  377.   try
  378.     {Define a rectangle to mark the dimensions of the thumbbar}
  379.     Rect1 := Rect(0,0,ThumbBmp.Width,ThumbBmp.Height);
  380.     {Create a working bitmap}
  381.     TmpBmp := TBitmap.Create;
  382.     TmpBmp.Height := ThumbBmp.Height;
  383.     TmpBmp.Width := ThumbBmp.Width;
  384.     {Copy the background area onto the working bitmap}
  385.     TmpBmp.Canvas.CopyMode := cmSrcCopy;
  386.     TmpBmp.Canvas.CopyRect(Rect1,BkgdBmp.Canvas,Rect1);
  387.     {Copy the mask onto the working bitmap with SRCAND}
  388.     TmpBmp.Canvas.CopyMode := cmSrcAnd;
  389.     TmpBmp.Canvas.CopyRect(Rect1,MaskBmp.Canvas,Rect1);
  390.     {Copy the thumbbar onto the working bitmap with SRCPAINT}
  391.     TmpBmp.Canvas.CopyMode := cmSrcPaint;
  392.     TmpBmp.Canvas.CopyRect(Rect1,ThumbBmp.Canvas,Rect1);
  393.     {Now draw the thumb bar}
  394.     Canvas.CopyRect(ThumbRect,TmpBmp.Canvas,Rect1);
  395.   finally
  396.     TmpBmp.Free;
  397.   end;
  398. end;
  399.  
  400. procedure TSlideBar.WhereIsBar;
  401. var
  402.   Each          : Real;
  403.   ThumbX,ThumbY : Integer;
  404. begin
  405.   {Calculate where to paint the thumb bar - store in ThumbRect}
  406.   if IsVert then
  407.     begin
  408.       Each := (Height-ThumbBmp.Height)/(Max-Min);
  409.       If Dragging then
  410.         ThumbY := DragVal-HalfTH
  411.       else
  412.         ThumbY := Height-Round(Each*(Position-Min))-ThumbBmp.Height;
  413.       ThumbY := MaxInt(0,MinInt(Height-ThumbBmp.Height,ThumbY));
  414.       ThumbX := (Width-ThumbBmp.Width) div 2;
  415.     end
  416.   else
  417.     begin
  418.       Each := (Width-ThumbBmp.Width)/(Max-Min);
  419.       if Dragging then
  420.         ThumbX := DragVal-HalfTW
  421.       else
  422.         ThumbX := Round(Each*(Position-Min));
  423.       ThumbX := MaxInt(0,MinInt(Width-ThumbBmp.Width,ThumbX));
  424.       ThumbY := (Height-ThumbBmp.Height) div 2;
  425.     end;
  426.   ThumbRect := Rect(ThumbX,ThumbY,ThumbX+ThumbBmp.Width,ThumbY+ThumbBmp.Height);
  427. end;
  428.  
  429. procedure TSlideBar.SetTLColor;
  430. begin
  431.   {Set the Top/Left color for the trench. Controls raised or lowered styles}
  432.   With Canvas do
  433.     if Style = bsLowered then Pen.Color := clGray else Pen.Color := clWhite;
  434. end;
  435.  
  436. procedure TSlideBar.SetBRColor;
  437. begin
  438.   {Set the Bottom/Right color for the trench. Controls raised or lowered styles}
  439.   With Canvas do
  440.     if Style = bsRaised then Pen.Color := clGray else Pen.Color := clWhite;
  441. end;
  442.  
  443. procedure TSlideBar.DrawTrench;
  444. var
  445.   X1,Y1,X2,Y2 : Integer;
  446.   Each        : Real;
  447.   Tmp,TickPos : Integer;
  448. begin
  449.   {This procedure simply draws the slot that the thumb bar will travel through}
  450.   {including the tick-marks. The bar itself is not drawn.}
  451.   with Canvas do begin
  452.     {Calculate the corners of the trench dependant on orientation}
  453.     if IsVert then
  454.       begin
  455.         X1 := (Width div 2) - (Thickness div 2) - 1;
  456.         X2 := X1 + Thickness + 1;
  457.         Y1 := HalfTH;
  458.         Y2 := Height-ThumbBmp.Height+Y1;
  459.       end
  460.     else
  461.       begin
  462.         X1 := HalfTW;
  463.         X2 := Width-ThumbBmp.Width+X1;
  464.         Y1 := (Height div 2) - (Thickness div 2) - 1;
  465.         Y2 := Y1 + Thickness + 1;
  466.       end;
  467.     Pen.Style := psSolid;
  468.     {Set the color for the Top & Left edges}
  469.     SetTLColor;
  470.     MoveTo(X2,Y1);
  471.     LineTo(X1,Y1);
  472.     LineTo(X1,Y2);
  473.     {Set the color for the Bottom & Right edges}
  474.     SetBRColor;
  475.     LineTo(X2,Y2);
  476.     LineTo(X2,Y1-1);
  477.     {Now do a filled black rectangle in the center if the control has focus}
  478.     with brush do if Focused then Color := FocusColor else Color := clSilver;
  479.     Pen.Style := psClear;
  480.     {Draw the focus highlight}
  481.     Rectangle(X1+1,Y1+1,X2+1,Y2+1);
  482.     Pen.Style := psSolid;
  483.     {Calculate spacing of tick marks}
  484.     Each := 0;
  485.     if Ticks then
  486.       if (Max-Min) > 0 then
  487.         if IsVert then
  488.           Each := (Height-ThumbBmp.Height)/(Max-Min)
  489.         else
  490.           Each := (Width-ThumbBmp.Width)/(Max-Min);
  491.     {Now draw the tick marks}
  492.     if Ticks then
  493.       for Tmp := Min to Max do
  494.         if IsVert then
  495.           begin
  496.             TickPos := Y2-Trunc(Each*(Tmp-Min))-1;
  497.             if Tmp = Max then TickPos := Y1;
  498.             SetTLColor; MoveTo(X1,TickPos);   LineTo(X1-2,TickPos);
  499.             SetBRColor; MoveTo(X1,TickPos+1); LineTo(X1-2,TickPos+1);
  500.           end
  501.         else
  502.           begin
  503.             TickPos := X1+Trunc(Each*(Tmp-Min));
  504.             if Tmp = Max then TickPos := X2-1;
  505.             SetTLColor; MoveTo(TickPos,Y1);   LineTo(TickPos,Y1-2);
  506.             SetBRColor; MoveTo(TickPos+1,Y1); LineTo(TickPos+1,Y1-2);
  507.           end;
  508.   end;
  509. end;
  510.  
  511. procedure TSlideBar.SaveBackground;
  512. begin
  513.   {This saves the background image so it can be restored later}
  514.   BkgdBmp.Width := ThumbBmp.Width;
  515.   BkgdBmp.Height := ThumbBmp.Height;
  516.   BkgdBmp.Canvas.CopyRect(Rect(0,0,ThumbBmp.Width,ThumbBmp.Height),
  517.                           Canvas,ThumbRect);
  518. end;
  519.  
  520. procedure TSlideBar.Paint;
  521. begin
  522.   DrawTrench;
  523.   WhereIsBar;
  524.   SaveBackground;
  525.   DrawThumbBar;
  526. end;
  527.  
  528.  
  529. end.
  530.  
  531. { SLIDEBAR.RES required to compile  --
  532.   Use XX3401 to DECODE the following block.
  533.   ..Cut the text to a text file named slidebar.xx
  534.   ..execute XX3401 D slidebar.xx
  535.   ..the "slidebar.res" will appear on your disk }
  536.  
  537.   { cut here -------------------------------------}
  538.  
  539. *XX3402-004167-011195--72--85-41244----SLIDEBAR.RES--1-OF--1
  540. zk2+zk2+2-+o+E++-U+E+0U++++U++++E+++++2++E++++++U+++++++++++++++++++++++
  541. ++++++++zzzz++Ds+++1y+++-zU+++Tw+++Dz+++4zk++-jo+++nJ+++Mp++++A++++1++++
  542. +k++++A++++1+++++k++++++++++++++++++++++++++++++++++++++++++++++++++++++
  543. ++++++++++++++++++++++++++++++++++++++++y+DzzzU1zzzk+zzzw+5zzy+-zzz++Tzz
  544. k+5zzs+-zzw6+zzza+zzzzVzzzzsTzzzy5zzzzVzzzzsTzzzzDzzzzzzzzzzzzzzzzzzzzzz
  545. zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz+U-0
  546. EJ6l+1++Y++++0U++++3++++0U++++2+-+++++++8++++++++++++++++++++-++++++++++
  547. ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz
  548. ++1zzzw+++++++Vr1RoDVkrR1sQ6W+y506UDVk++1sQ+++y5+++Dy++++++++Dw0+27-IX3B
  549. EJB9+1++Y++++0U++++3++++0U++++2+-+++++++8++++++++++++++++++++-++++++++++
  550. ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz
  551. ++1zzzw+w+1k++++1Ro+++rR+++6W+++06U+++++++++++++++++++++w+1k+Dw0+27-IX6+
  552. A+0M++++8+++++M++++A+++++E+2+++++++k++++++++++++++++++++2++++++++++++6++
  553. +6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+zzw++Dzz
  554. zk++++++05Rk++y6Q++DW51R1sVkrEy6Q6UDW5061sVk++y6Q++DW5++1zy+++++++1z+U-0
  555. EJ6mHI3HGk+k+7U++++c++++-U++++k++++-++E++++++1+++++++++++++++++++++E++++
  556. ++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk+++Dw+
  557. zk1zzk++zzzz+D++1k+++++++++++++++Bo+++1R++++W++++6U+++++++++++++++++++++
  558. w++D+Dw0+27-IXA+A+0E++++8+++++c++++3+++++E+2+++++++c++++++++++++++++++++
  559. 2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+
  560. ++1z+Dw+zzw++Dzzzk++++++++2E+EVrRrRkJJJJ1sW6W5-JJJIDzzzzU3JJJE++++++JJJJ
  561. zk6+EY3GAop-Iog+A+0E++++8+++++c++++3+++++E+2+++++++c++++++++++++++++++++
  562. 2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+
  563. ++1z+Dw+zzw++Dzzzk1k++++1k+++++++++++++++++++++++++++++++++++D+++++D++++
  564. zk6+EY3GB++k+7U++++c++++1+++++M++++-++E++++++1+++++++++++++++++++++E++++
  565. ++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk+++Dw+
  566. zk1zzk++zzzz++++++++++++05RrRrRk2F2DW6W6W5-2F+y6W6W6Q-2F1zzzzzy+F2E+++++
  567. +++++Dw0+27-IXFBEJB9+1++a++++0U++++A++++-U++++2+-+++++++A+++++++++++++++
  568. +++++-++++++++++++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1z
  569. zk1z++++zk1z+Dzz++1zzzw+w++++++D+++++++++++F2E+++++++2F2++++++++2F2+++++
  570. ++-2FD++++++1k++zk6+EoZGEol3AE+k+6U++++c++++0+++++U++++-++E++++++0++++++
  571. +++++++++++++++E++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z
  572. ++1z++++zzw+zk+++Dw+zk1zzk++zzzz++++++++VrQ+06W5Q+y6W5+DW6Vk1zW6U+1zy+++
  573. ++++zk6+EoZGEol3AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++
  574. ++++++++2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk++
  575. +Dzz+Dw+++1z+Dw+zzw++Dzzzk1z++1zw+++1k++++++++++++++++++++1k+++Dzk++zzw0
  576. +2F7EIpDHYEl+1++W++++0U++++6++++0+++++2+-+++++++6++++++++++++++++++++-++
  577. ++++++++++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++
  578. zk1z+Dzz++1zzzw++++++++5Q+++W5Q+1sW5Q+zsW5++zsU+++zk++++++1z+U-2GI3BHot2
  579. AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++++++++++2+++++++
  580. +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+
  581. zzw++Dzzzk1zw+zzzk++zz++++w++++++++++D++++zz++1zzz+Dzzw0+2F7EIpDHYEm+1++
  582. m++++0U++++A++++1+++++2+-+++++++M++++++++++++++++++++-++++++++++++0+++0+
  583. ++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz++1zzzw+
  584. ++++++++Xz++++Rk++1zw+++S6Q++CXk++S6W5++vj++S6W6Vk-aM+S6W6W6Q+vU1sW6W6Xk
  585. ti++y6W6Xk1is++DW6Xk+CvU++1sXk++vi++++zk++-as++++++++CvUzk6+F2Z-HIxCF17B
  586. EJB9+1++m++++0U++++A++++1+++++2+-+++++++M++++++++++++++++++++-++++++++++
  587. ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz
  588. ++1zzzw+zzzk1zzzXz1zzk++zzzzwDzk+++DzyXkzk++++1zvj1k++++++xaM+++++++++vU
  589. ++++++++ti1k++++++zisDw+++++zyvUzz++++zzvi1zzk++zzxasDzzw+zzzyvUzk6+F2Z-
  590. HIxCF1A+A+0k++++8+++++Y++++7+++++E+2++++++-6++++++++++++++++++++2+++++++
  591. +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+
  592. zzw++Dzzzk++++++-JJJJE++Q+++++++++Vr++JJJJI+W6Rk+E++++zsW5Q++++++Dy6U+++
  593. ++++1zU+++++++++w+++++++++++++++++1z+U-2GI3BHot2Aop-Iog+A+0k++++8+++++Y+
  594. +++7+++++E+2++++++-6++++++++++++++++++++2++++++++++++6+++6++++0+U+0+++++
  595. U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+zzw++Dzzzk1zzkzzxJJJJTzk
  596. +Dzk++++zk++1zJJJJLk++++wE++++++++++++++w++++D++++1z+++Dw++++Dzk+Dzk++++
  597. zzwDzz++++1z+U-2GI3BHot2B++k+A+++++c++++0k++++g++++-++E++++++3U+++++++++
  598. +++++++++++E++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z
  599. ++++zzw+zk+++Dw+zk1zzk++zzzz+++++++++++++++5+++++++++6Rk++JJJE+6W5Q+++++
  600. +6W6Vr+3JJIDy6W6Rk++++1zW6W+++++++zsW++++++++Dy+++++++++1k++++++++++++++
  601. ++1z+U-2GI3BHot2B2p-Iog+A+1+++++8+++++g++++9+++++E+2++++++-M++++++++++++
  602. ++++++++2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk++
  603. +Dzz+Dw+++1z+Dw+zzw++Dzzzk1zzz1zzz+++Dzz++zzw+++zz+++DzpJJLz++++1z+++D++
  604. ++++xJJJ++++++++++1k+++++D+++Dw++++Dw+++zz+++Dzk++1zzk+Dzz+++DzzwDzzw+++
  605. zk6+Ip3JEJ73AE+k+6U++++c++++0+++++U++++-++E++++++0+++++++++++++++++++++E
  606. ++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk++
  607. +Dw+zk1zzk++zzzz+++++++6RrRk1sW6Q+y6W5+DW6Vk1sW6Q+zzzs++++++zk6+Ip3JEJ73
  608. AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++++++++++2+++++++
  609. +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+
  610. zzw++Dzzzk+++++++++++++++++++++++++++++++++++++++++++DwA+2V-HYFEHoZCJ2JG
  611. +1+EFU2++++++U+-+0++E++-++2+B+2+++2++++c++++6++++2+++++-++2++++++6++++++
  612. +++++++++++++++++++++++++Dzzzk+1y++++zU+++Ts+++5z+++1zk++-jw+++Px+++ApE+
  613. +4BE+++1+++++k++++A++++1+++++k++++A+++++++++++++++++++++++++++++++++++++
  614. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++DU1zzzs+zzzw+Dz
  615. zz+-zzzU+Tzzk+5zzw+-zzy++Tzz0+DzztUDzzzsTzzzy5zzzzVzzzzsTzzzy5zzzznzzzzz
  616. zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
  617. zzzzzzzzzzzz
  618. ***** END OF BLOCK 1 *****
  619.  
  620.  
  621.  
  622.